package org.malred.hospital.utils;

import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.Velocity;

import java.io.FileWriter;
import java.io.IOException;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;

public class GenUtils {
    public static void genMethodRepository(
            String entityName, String entityFullName, Map<String, String> paramMap
    ) throws IOException {
        // 1,设置velocity的资源加载器
        Properties prop = new Properties();
        prop.put("file.resource.loader.class",
                "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader");
        // 2,初始化velocity引擎
        Velocity.init(prop);
        // 3,创建velocity容器
        VelocityContext context = new VelocityContext();
        // 设置数据
        context.put("entityName", entityName);
        context.put("entityFullName", entityFullName);
        // 4,加载velocity模板文件
        Template template = Velocity.getTemplate("GenRepository.vm", "utf-8");
        // 5,合并数据到模板
        FileWriter fw = new FileWriter("src/main/resources/" + entityName + "GenRepository.java");
        // 合并+写入
        template.merge(context, fw);
        // 6,释放资源
        fw.close();
    }

    public static void genController(
            String entityName, String entityFullName, String route
    ) throws IOException {
        // 1,设置velocity的资源加载器
        Properties prop = new Properties();
        prop.put("file.resource.loader.class",
                "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader");
        // 2,初始化velocity引擎
        Velocity.init(prop);
        // 3,创建velocity容器
        VelocityContext context = new VelocityContext();
        // 设置数据
        context.put("entityName", entityName);
        context.put("entityFullName", entityFullName);
        context.put("route", route);
        // 4,加载velocity模板文件
        Template template = Velocity.getTemplate("vms/genController.vm", "utf-8");
        // 5,合并数据到模板
        FileWriter fw =
                new FileWriter("src/main/resources/gen/controller/" + entityName + "Controller.java");
        // 合并+写入
        template.merge(context, fw);
        // 6,释放资源
        fw.close();
    }

    public static void genTsType(
            String entityName, Class<?> aclass
    ) throws IOException {
        // 1,设置velocity的资源加载器
        Properties prop = new Properties();
        prop.put("file.resource.loader.class",
                "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader");
        // 2,初始化velocity引擎
        Velocity.init(prop);
        // 3,创建velocity容器
        VelocityContext context = new VelocityContext();
        // 设置数据 k-类型 v-变量名
        Map<String, String> map = new HashMap();
        for (Field declaredField : aclass.getDeclaredFields()) {
            map.put(
                    switchType(declaredField.getType().getSimpleName()),
                    declaredField.getName()
            );
        }
        context.put("map", map);
        context.put("entityName", entityName);
        // 4,加载velocity模板文件
        Template template = Velocity.getTemplate("vms/genTsType.vm", "utf-8");
        // 5,合并数据到模板
        FileWriter fw =
                new FileWriter("src/main/resources/gen/tstype/" + entityName + ".ts");
        // 合并+写入
        template.merge(context, fw);
        // 6,释放资源
        fw.close();
    }

    public static String switchType(String typeName) {
        switch (typeName) {
            case "long":
                return "number";
            case "Long":
                return "number";
            case "String":
                return "string";
            case "LocalDateTime":
                return "string";
            default:
                return "any";
        }
    }
}
